home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / lisp / kcl / akcl / akcl1615.lha / doc / funcall.lsp < prev    next >
Lisp/Scheme  |  1989-08-28  |  3KB  |  82 lines

  1.  
  2. I have been trying to improve funcall so that functions of a fixed
  3. number of args can be funcalled with almost the same speed as
  4. they can be called if the name is laid down in the file.   Basically
  5. I have made functions with a fixed number of args, first class
  6. compiled-function objects, and removed the si::cdefn property stuff.
  7. It is no longer necessary to have a global version of the function,
  8. since one can now use the C stack version anywhere.   I have made
  9. compiled function objects slightly smaller, but with more information.
  10. So the number of args and there types is encoded in these C functions.
  11. It will soon be possible to do fast cross file calling of functions
  12. with mixed fixnum and general args and one return value.
  13.  
  14. After these changes:
  15.  
  16. A comparison of calling a fixed arg function of 1 argument:
  17. (the second time for KCL is for when the function is in a separate file).
  18.  
  19.                LUCID     AKCL   KCL
  20. funcall        8.3       3.54   18.8           (funcall x nil) where x = #'foo
  21. Direct call    7.44      2.78   3.16(23.4)     (foo nil)
  22.  
  23. (proclaim '(function foo (t) t)) 
  24. (defun line1 (x n) (sloop for i below n with y do (setq y (funcall x nil))))
  25. (defun line2 (n) (sloop for i below n with y do (setq y (foo nil))))
  26. (defun foo (x) x nil)
  27.  
  28. It is able to detect that only one value from the funcall is desired,
  29. because of the setq.   In general the following macro can be used to inform
  30. the compiler of this.
  31.  
  32. (defmacro vfuncall (x &rest args)
  33.  `(the (values t) (funcall ,x ,@ args)))
  34.  
  35. We can not lay down the new funcall code if multiple values might be desired:
  36. (defun joe (x) (funcall x nil))
  37. will have its number of values returned depend on x.
  38.  
  39. (defun joe (x) (the (values t) (funcall x nil)))
  40. or
  41. (defun joe (x) (setq x (funcall x nil)))
  42.  
  43. would allow it however.
  44.  
  45. Unfortunately AKCL is much slower if the function to be funcalled does
  46. not happen to be a compiled function which was compiled while
  47. proclaimed with a fixed number of args and one value.  Still there are
  48. a number of critical applications where it is useful to have a very
  49. fast funcall.  I have no useful heuristic at the moment for 'guessing'
  50. which kind of funcall I should lay down: One optimized for C stack or
  51. one optimized for Lisp stack.  I can only detect when it is safe to
  52. lay down a C stack one.  However if the function in question uses the
  53. lisp stack, and is called via the C stack, the call will be twice as
  54. slow as it used to be.  This is very unfortunate!  At the cost of
  55. space I could avoid this, but the new funcall takes up less space than
  56. the old one and I hate to lay down two types in the code just in
  57. case....   The check as to type is being laid down, but a trick is
  58. used to keep space different minimal.
  59.  
  60. SPACE:
  61.  
  62. I have also noted some size differences (as reported by size *.o)
  63. where the amounts are the 'dec' = decimal representation of
  64. text+data+bss in the object file.   This is what gets loaded.
  65. There is still room for improvement here.   Most of the difference
  66. is due to the fact that functions of fixed args only need one
  67. entry now.
  68.  
  69.  
  70. Before:                  After:
  71. 31340    basis.o       28348
  72. 76584    code-1-a.o    63212
  73. 94136    code-b-d.o    79136
  74. 93372    code-e-m.o    75384
  75. 125172    code-n-r.o    10524
  76. 77148    code-s-z.o    61840
  77. 15620    events.o      14504
  78. 4036    genfact.o     3464 
  79. 27908    io.o          24544
  80. 9132    ppr.o          8340 
  81. 42668    sloop.o          40484
  82.